// 简答题
// 一、
// 由于js是单线程的，所以一些耗时的动作会阻塞主线程代码的执行，所以js支持异步操作，解决主线程阻塞的问题。
// EventLoop是指，执行栈首先执行同步代码，然后遇到异步任务，将其放入消息队列中，待执行栈中同步代码执行完毕，再从消息队列中取出任务，放入执行栈中进行执行，如果在遇到异步任务，再次放入消息队列中，如此循环往复。消息队列是存放异步任务用的。
// 宏任务有setTimeout，setInterval，setImmediate，script包裹的代码块
// 微任务有 promise，process.nextTick,observerMutation。

// 代码题
// 一、
new Promise((resolve, reject) => {
    resolve('hello')
}).then(val => {
   return val + 'lagou' 
}).then(val => {
    console.log(val + 'I love U')
}).catch(err => {
console.log(err)
})



// 二、
// const { flowRight } = require('lodash')
const fp = require('lodash/fp')
const cars = [{
name: 1,
in_stock: false,
dollar_value: 35000
},{
name: 2,
in_stock: false,
dollar_value: 50000
},{
name: 3,
in_stock: true,
dollar_value: 80000
}]
// 练习1
const isLastInStock = fp.flowRight(fp.prop('in_stock'), fp.last)
console.log(isLastInStock(cars))

// 练习2
const isFirstName = fp.flowRight(fp.prop('name'), fp.first)
console.log(isFirstName(cars))

// 练习3
let _average = function(xs) {
return fp.reduce(fp.add, 0, xs) / xs.length
}
let averageDollarValue = fp.flowRight(_average, fp.map(fp.prop('dollar_value')))
console.log(averageDollarValue(cars))

// 练习4
let _underscore = fp.replace(/\W+/g, '_')
// let sanitizeNames = fp.flowRight(fp.map(_underscore),fp.map(fp.toLower))
let sanitizeNames = fp.flowRight(fp.map(fp.flowRight(_underscore,fp.toLower)))
console.log(sanitizeNames(["Hello World"]))






// 二、
const fp = require('lodash/fp')
// 练习1.
let maybe = MayBe.of([5,6,1])
let ex1 = (num) => {
return maybe.map(fp.map(fp.add(num)))._value
}
console.log(ex1(5))

// 练习2

let xs = Container.of(['do', 'ray', 'mi', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = () => {
return xs.map(fp.first)._value
}
console.log(ex2())

// 练习3
let safeProp = fp.curry(function(x, o) {
return MayBe.of(o[x])._value
})
let user = {
id: 2,
name: 'Albert'
}
let ex3 = () => {
return safeProp('name', user).map(fp.first)._value
}
console.log(ex3())

// 练习4
// let ex4 = function (n) {
//     if (n) {
//         return parseInt(n)
//     }
// }
let ex4 = (n) => {
return MayBe.of(n).map(parseInt)._value
}
console.log(ex4('5'))
console.log(ex4(null))